home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / p063b9s.zip / UNIT / FAXCONV.PAS < prev    next >
Pascal/Delphi Source File  |  1996-04-20  |  16KB  |  481 lines

  1. Unit FaxConv;
  2. {╔══════════════════════════════════════════════════════════════════════════╗}
  3. {║ Conversion of .FAX TO .PCX file               Last changed: 20.04.96  SA ║}
  4. {║                                                                          ║}
  5. {║                      Original code by: Bo Bendtsen                       ║}
  6. {║                         (C) Copyright 1989-93 by                         ║}
  7. {║       Dan Wulff, Jens Sandalgaard, Steen Christensen & S¢ren Ager        ║}
  8. {║                                                                          ║}
  9. {║ This source may not be given TO anybody, without the written permission  ║}
  10. {║ from The Portal Team.                                                    ║}
  11. {╚══════════════════════════════════════════════════════════════════════════╝}
  12. {$I POPDEFS.INC}
  13.  
  14. Interface
  15.  
  16. USES Use32, Dos;
  17.  
  18. PROCEDURE FaxToPcx(FaxFilename: PathStr);
  19.  
  20. IMPLEMENTATION
  21.  
  22. USES OpRoot, OpString,
  23.      Util, Display;
  24.  
  25. TYPE
  26.   PCXHdr = record
  27.     manufacturer   : Byte;
  28.     version        : Byte;
  29.     encode_mode    : Byte;
  30.     bits_per_pixel : Byte;
  31.     start_x        : Word;
  32.     start_y        : Word;
  33.     end_x          : Word;
  34.     end_y          : Word;
  35.     x_resolution   : Word;
  36.     y_resolution   : Word;
  37.     palette_RGB    : array[1..48] of Byte;
  38.     vmode          : Byte; {ignored}
  39.     planes         : Byte;
  40.     bytes_per_line : Word;
  41.     unused         : array[1..60] of Byte;
  42.   END;
  43.  
  44.   Fax1dRecord = Record
  45.     Data,
  46.     Mask  : Word;
  47.     Size  : Byte;
  48.     Value : Word;
  49.   END;
  50.  
  51.   BmpLineType = Array[1..216] of Byte;
  52.  
  53. Const
  54.   WhiteMakeUp : Array[1..27] of Fax1dRecord = (
  55.     (Data:$1b00;Mask:$1f00;Size: 5;Value: 0),
  56.     (Data:$1200;Mask:$1f00;Size: 5;Value: 1),
  57.     (Data:$0b80;Mask:$1f80;Size: 6;Value: 2),
  58.     (Data:$0dc0;Mask:$1fc0;Size: 7;Value: 3),
  59.     (Data:$06c0;Mask:$1fe0;Size: 8;Value: 4),
  60.     (Data:$06e0;Mask:$1fe0;Size: 8;Value: 5),
  61.     (Data:$0c80;Mask:$1fe0;Size: 8;Value: 6),
  62.     (Data:$0ca0;Mask:$1fe0;Size: 8;Value: 7),
  63.     (Data:$0d00;Mask:$1fe0;Size: 8;Value: 8),
  64.     (Data:$0ce0;Mask:$1fe0;Size: 8;Value: 9),
  65.     (Data:$0cc0;Mask:$1ff0;Size: 9;Value:10),
  66.     (Data:$0cd0;Mask:$1ff0;Size: 9;Value:11),
  67.     (Data:$0d20;Mask:$1ff0;Size: 9;Value:12),
  68.     (Data:$0d30;Mask:$1ff0;Size: 9;Value:13),
  69.     (Data:$0d40;Mask:$1ff0;Size: 9;Value:14),
  70.     (Data:$0d50;Mask:$1ff0;Size: 9;Value:15),
  71.     (Data:$0d60;Mask:$1ff0;Size: 9;Value:16),
  72.     (Data:$0d70;Mask:$1ff0;Size: 9;Value:17),
  73.     (Data:$0d80;Mask:$1ff0;Size: 9;Value:18),
  74.     (Data:$0d90;Mask:$1ff0;Size: 9;Value:19),
  75.     (Data:$0da0;Mask:$1ff0;Size: 9;Value:20),
  76.     (Data:$0db0;Mask:$1ff0;Size: 9;Value:21),
  77.     (Data:$0980;Mask:$1ff0;Size: 9;Value:22),
  78.     (Data:$0990;Mask:$1ff0;Size: 9;Value:23),
  79.     (Data:$09a0;Mask:$1ff0;Size: 9;Value:24),
  80.     (Data:$0c00;Mask:$1f80;Size: 6;Value:25),
  81.     (Data:$09b0;Mask:$1ff0;Size: 9;Value:26)  );
  82.  
  83.   FaxWhite : Array[1..64] of Fax1dRecord = (
  84.     (Data:$06a0;Mask:$1fe0;Size: 8;Value: 0),
  85.     (Data:$0380;Mask:$1f80;Size: 6;Value: 1),
  86.     (Data:$0e00;Mask:$1e00;Size: 4;Value: 2),
  87.     (Data:$1000;Mask:$1e00;Size: 4;Value: 3),
  88.     (Data:$1600;Mask:$1e00;Size: 4;Value: 4),
  89.     (Data:$1800;Mask:$1e00;Size: 4;Value: 5),
  90.     (Data:$1c00;Mask:$1e00;Size: 4;Value: 6),
  91.     (Data:$1e00;Mask:$1e00;Size: 4;Value: 7),
  92.     (Data:$1300;Mask:$1f00;Size: 5;Value: 8),
  93.     (Data:$1400;Mask:$1f00;Size: 5;Value: 9),
  94.     (Data:$0700;Mask:$1f00;Size: 5;Value:10),
  95.     (Data:$0800;Mask:$1f00;Size: 5;Value:11),
  96.     (Data:$0400;Mask:$1f80;Size: 6;Value:12),
  97.     (Data:$0180;Mask:$1f80;Size: 6;Value:13),
  98.     (Data:$1a00;Mask:$1f80;Size: 6;Value:14),
  99.     (Data:$1a80;Mask:$1f80;Size: 6;Value:15),
  100.     (Data:$1500;Mask:$1f80;Size: 6;Value:16),
  101.     (Data:$1580;Mask:$1f80;Size: 6;Value:17),
  102.     (Data:$09c0;Mask:$1fc0;Size: 7;Value:18),
  103.     (Data:$0300;Mask:$1fc0;Size: 7;Value:19),
  104.     (Data:$0200;Mask:$1fc0;Size: 7;Value:20),
  105.     (Data:$05c0;Mask:$1fc0;Size: 7;Value:21),
  106.     (Data:$00c0;Mask:$1fc0;Size: 7;Value:22),
  107.     (Data:$0100;Mask:$1fc0;Size: 7;Value:23),
  108.     (Data:$0a00;Mask:$1fc0;Size: 7;Value:24),
  109.     (Data:$0ac0;Mask:$1fc0;Size: 7;Value:25),
  110.     (Data:$04c0;Mask:$1fc0;Size: 7;Value:26),
  111.     (Data:$0900;Mask:$1fc0;Size: 7;Value:27),
  112.     (Data:$0600;Mask:$1fc0;Size: 7;Value:28),
  113.     (Data:$0040;Mask:$1fe0;Size: 8;Value:29),
  114.     (Data:$0060;Mask:$1fe0;Size: 8;Value:30),
  115.     (Data:$0340;Mask:$1fe0;Size: 8;Value:31),
  116.     (Data:$0360;Mask:$1fe0;Size: 8;Value:32),
  117.     (Data:$0240;Mask:$1fe0;Size: 8;Value:33),
  118.     (Data:$0260;Mask:$1fe0;Size: 8;Value:34),
  119.     (Data:$0280;Mask:$1fe0;Size: 8;Value:35),
  120.     (Data:$02a0;Mask:$1fe0;Size: 8;Value:36),
  121.     (Data:$02c0;Mask:$1fe0;Size: 8;Value:37),
  122.     (Data:$02e0;Mask:$1fe0;Size: 8;Value:38),
  123.     (Data:$0500;Mask:$1fe0;Size: 8;Value:39),
  124.     (Data:$0520;Mask:$1fe0;Size: 8;Value:40),
  125.     (Data:$0540;Mask:$1fe0;Size: 8;Value:41),
  126.     (Data:$0560;Mask:$1fe0;Size: 8;Value:42),
  127.     (Data:$0580;Mask:$1fe0;Size: 8;Value:43),
  128.     (Data:$05a0;Mask:$1fe0;Size: 8;Value:44),
  129.     (Data:$0080;Mask:$1fe0;Size: 8;Value:45),
  130.     (Data:$00a0;Mask:$1fe0;Size: 8;Value:46),
  131.     (Data:$0140;Mask:$1fe0;Size: 8;Value:47),
  132.     (Data:$0160;Mask:$1fe0;Size: 8;Value:48),
  133.     (Data:$0a40;Mask:$1fe0;Size: 8;Value:49),
  134.     (Data:$0a60;Mask:$1fe0;Size: 8;Value:50),
  135.     (Data:$0a80;Mask:$1fe0;Size: 8;Value:51),
  136.     (Data:$0aa0;Mask:$1fe0;Size: 8;Value:52),
  137.     (Data:$0480;Mask:$1fe0;Size: 8;Value:53),
  138.     (Data:$04a0;Mask:$1fe0;Size: 8;Value:54),
  139.     (Data:$0b00;Mask:$1fe0;Size: 8;Value:55),
  140.     (Data:$0b20;Mask:$1fe0;Size: 8;Value:56),
  141.     (Data:$0b40;Mask:$1fe0;Size: 8;Value:57),
  142.     (Data:$0b60;Mask:$1fe0;Size: 8;Value:58),
  143.     (Data:$0940;Mask:$1fe0;Size: 8;Value:59),
  144.     (Data:$0960;Mask:$1fe0;Size: 8;Value:60),
  145.     (Data:$0640;Mask:$1fe0;Size: 8;Value:61),
  146.     (Data:$0660;Mask:$1fe0;Size: 8;Value:62),
  147.     (Data:$0680;Mask:$1fe0;Size: 8;Value:63)   );
  148.  
  149.   BlackMakeUp : Array[1..27] of Fax1dRecord = (
  150.     (Data:$0078;Mask:$1ff8;Size:10;Value: 0),
  151.     (Data:$0190;Mask:$1ffe;Size:12;Value: 1),
  152.     (Data:$0192;Mask:$1ffe;Size:12;Value: 2),
  153.     (Data:$00b6;Mask:$1ffe;Size:12;Value: 3),
  154.     (Data:$0066;Mask:$1ffe;Size:12;Value: 4),
  155.     (Data:$0068;Mask:$1ffe;Size:12;Value: 5),
  156.     (Data:$006a;Mask:$1ffe;Size:12;Value: 6),
  157.     (Data:$006c;Mask:$1fff;Size:13;Value: 7),
  158.     (Data:$006d;Mask:$1fff;Size:13;Value: 8),
  159.     (Data:$004a;Mask:$1fff;Size:13;Value: 9),
  160.     (Data:$004b;Mask:$1fff;Size:13;Value:10),
  161.     (Data:$004c;Mask:$1fff;Size:13;Value:11),
  162.     (Data:$004d;Mask:$1fff;Size:13;Value:12),
  163.     (Data:$0072;Mask:$1fff;Size:13;Value:13),
  164.     (Data:$0073;Mask:$1fff;Size:13;Value:14),
  165.     (Data:$0074;Mask:$1fff;Size:13;Value:15),
  166.     (Data:$0075;Mask:$1fff;Size:13;Value:16),
  167.     (Data:$0076;Mask:$1fff;Size:13;Value:17),
  168.     (Data:$0077;Mask:$1fff;Size:13;Value:18),
  169.     (Data:$0052;Mask:$1fff;Size:13;Value:19),
  170.     (Data:$0053;Mask:$1fff;Size:13;Value:20),
  171.     (Data:$0054;Mask:$1fff;Size:13;Value:21),
  172.     (Data:$0055;Mask:$1fff;Size:13;Value:22),
  173.     (Data:$005a;Mask:$1fff;Size:13;Value:23),
  174.     (Data:$005b;Mask:$1fff;Size:13;Value:24),
  175.     (Data:$0064;Mask:$1fff;Size:13;Value:25),
  176.     (Data:$0065;Mask:$1fff;Size:13;Value:26)    );
  177.  
  178.   FaxBlack : Array[1..64] of Fax1dRecord = (
  179.     (Data:$01b8;Mask:$1ff8;Size:10;Value: 0),
  180.     (Data:$0800;Mask:$1c00;Size: 3;Value: 1),
  181.     (Data:$1800;Mask:$1800;Size: 2;Value: 2),
  182.     (Data:$1000;Mask:$1800;Size: 2;Value: 3),
  183.     (Data:$0c00;Mask:$1c00;Size: 3;Value: 4),
  184.     (Data:$0600;Mask:$1e00;Size: 4;Value: 5),
  185.     (Data:$0400;Mask:$1e00;Size: 4;Value: 6),
  186.     (Data:$0300;Mask:$1f00;Size: 5;Value: 7),
  187.     (Data:$0280;Mask:$1f80;Size: 6;Value: 8),
  188.     (Data:$0200;Mask:$1f80;Size: 6;Value: 9),
  189.     (Data:$0100;Mask:$1fc0;Size: 7;Value:10),
  190.     (Data:$0140;Mask:$1fc0;Size: 7;Value:11),
  191.     (Data:$01c0;Mask:$1fc0;Size: 7;Value:12),
  192.     (Data:$0080;Mask:$1fe0;Size: 8;Value:13),
  193.     (Data:$00e0;Mask:$1fe0;Size: 8;Value:14),
  194.     (Data:$0180;Mask:$1ff0;Size: 9;Value:15),
  195.     (Data:$00b8;Mask:$1ff8;Size:10;Value:16),
  196.     (Data:$00c0;Mask:$1ff8;Size:10;Value:17),
  197.     (Data:$0040;Mask:$1ff8;Size:10;Value:18),
  198.     (Data:$019c;Mask:$1ffc;Size:11;Value:19),
  199.     (Data:$01a0;Mask:$1ffc;Size:11;Value:20),
  200.     (Data:$01b0;Mask:$1ffc;Size:11;Value:21),
  201.     (Data:$00dc;Mask:$1ffc;Size:11;Value:22),
  202.     (Data:$00a0;Mask:$1ffc;Size:11;Value:23),
  203.     (Data:$005c;Mask:$1ffc;Size:11;Value:24),
  204.     (Data:$0060;Mask:$1ffc;Size:11;Value:25),
  205.     (Data:$0194;Mask:$1ffe;Size:12;Value:26),
  206.     (Data:$0196;Mask:$1ffe;Size:12;Value:27),
  207.     (Data:$0198;Mask:$1ffe;Size:12;Value:28),
  208.     (Data:$019a;Mask:$1ffe;Size:12;Value:29),
  209.     (Data:$00d0;Mask:$1ffe;Size:12;Value:30),
  210.     (Data:$00d2;Mask:$1ffe;Size:12;Value:31),
  211.     (Data:$00d4;Mask:$1ffe;Size:12;Value:32),
  212.     (Data:$00d6;Mask:$1ffe;Size:12;Value:33),
  213.     (Data:$01a4;Mask:$1ffe;Size:12;Value:34),
  214.     (Data:$01a6;Mask:$1ffe;Size:12;Value:35),
  215.     (Data:$01a8;Mask:$1ffe;Size:12;Value:36),
  216.     (Data:$01aa;Mask:$1ffe;Size:12;Value:37),
  217.     (Data:$01ac;Mask:$1ffe;Size:12;Value:38),
  218.     (Data:$01ae;Mask:$1ffe;Size:12;Value:39),
  219.     (Data:$00d8;Mask:$1ffe;Size:12;Value:40),
  220.     (Data:$00da;Mask:$1ffe;Size:12;Value:41),
  221.     (Data:$01b4;Mask:$1ffe;Size:12;Value:42),
  222.     (Data:$01b6;Mask:$1ffe;Size:12;Value:43),
  223.     (Data:$00a8;Mask:$1ffe;Size:12;Value:44),
  224.     (Data:$00aa;Mask:$1ffe;Size:12;Value:45),
  225.     (Data:$00ac;Mask:$1ffe;Size:12;Value:46),
  226.     (Data:$00ae;Mask:$1ffe;Size:12;Value:47),
  227.     (Data:$00c8;Mask:$1ffe;Size:12;Value:48),
  228.     (Data:$00ca;Mask:$1ffe;Size:12;Value:49),
  229.     (Data:$00a4;Mask:$1ffe;Size:12;Value:50),
  230.     (Data:$00a6;Mask:$1ffe;Size:12;Value:51),
  231.     (Data:$0048;Mask:$1ffe;Size:12;Value:52),
  232.     (Data:$006e;Mask:$1ffe;Size:12;Value:53),
  233.     (Data:$0070;Mask:$1ffe;Size:12;Value:54),
  234.     (Data:$004e;Mask:$1ffe;Size:12;Value:55),
  235.     (Data:$0050;Mask:$1ffe;Size:12;Value:56),
  236.     (Data:$00b0;Mask:$1ffe;Size:12;Value:57),
  237.     (Data:$00b2;Mask:$1ffe;Size:12;Value:58),
  238.     (Data:$0056;Mask:$1ffe;Size:12;Value:59),
  239.     (Data:$0058;Mask:$1ffe;Size:12;Value:60),
  240.     (Data:$00b4;Mask:$1ffe;Size:12;Value:61),
  241.     (Data:$00cc;Mask:$1ffe;Size:12;Value:62),
  242.     (Data:$00ce;Mask:$1ffe;Size:12;Value:63)    );
  243.  
  244.   EOLRUN : Fax1dRecord = (Data:$0002;Mask:$1ffe;Size:12;Value:0);
  245.  
  246.  
  247.   Procedure FaxToPcx(FaxFilename: PathStr);
  248.   Var
  249.     chf       : Byte;
  250.     dataword  : Word;
  251.     dataword1 : Word;
  252.     counter   : Byte;
  253.     buftop    : Byte;
  254.     EOL_count : Word;
  255.     EOL_co    : Word;
  256.     flag      : Boolean;
  257.     FaxSize   : Longint;
  258.     BytesLeft : Longint;
  259.     PosX      : Word;
  260.     PosY      : Word;
  261.     IO        : Word;
  262.     x,y,z     : Word;
  263.     BmpLine   : BmpLineType;
  264.     PCX       : PCXHdr;
  265.     FaxFile,
  266.     PCXFile   : BufIDStreamPtr;
  267.     Gauge     : PGauge;
  268.  
  269.     Procedure BmpPixel(Pos:Word);
  270.     Var
  271.       w:word;
  272.       b:Byte;
  273.     BEGIN
  274.       Dec(Pos);
  275.       b:=(Pos Shr 3)+1;
  276.       w:=$80 shr (Pos-(Pos Shr 3 SHL 3));
  277.       BmpLine[b]:=BmpLine[b] AND not w;
  278.     END;
  279.  
  280.     PROCEDURE PutPCXLine(Count: Byte);
  281.     var
  282.       Last, CPtr, RunCount: Byte;
  283.  
  284.       PROCEDURE PutPCXByte (Wert, Count: Byte);
  285.       BEGIN
  286.         IF (Count=1) AND ($C0 <> $C0 AND Wert) THEN
  287.         BEGIN
  288.           PCXFile^.Write(Wert,1);
  289.         END ELSE
  290.         BEGIN
  291.           Count := $C0 or Count;
  292.           PCXFile^.Write(Count,1);
  293.           PCXFile^.Write(Wert,1);
  294.         END;
  295.       END;
  296.  
  297.     BEGIN
  298.       Last := BmpLine[1];
  299.       RunCount := 1;
  300.       FOR CPtr := 1 TO Count-1 DO
  301.       BEGIN
  302.         IF BmpLine[CPtr+1] = Last THEN
  303.         BEGIN
  304.           Inc (RunCount);
  305.           IF RunCount = 62 THEN
  306.           BEGIN
  307.             PutPCXByte(Last, RunCount);
  308.             RunCount := 0;
  309.           END;
  310.         END ELSE
  311.         BEGIN
  312.           PutPCXByte(Last,RunCount);
  313.           Last := BmpLine[CPtr+1];
  314.           RunCount := 1;
  315.         END;
  316.       END;
  317.       IF RunCount>0 THEN PutPCXByte(Last,RunCount);
  318.     END;
  319.  
  320.   BEGIN
  321.     New(FaxFile, Init(FaxFileName, SOpenRead, Max64k((MaxAvail-1024) DIV 2)));
  322.     IF FaxFile=Nil THEN Exit;
  323.     New(PCXFile, Init(ForceExtension(FaxFileName, 'PCX'), SCreate, Max64k((MaxAvail-1024) DIV 2)));
  324.     IF PCXFile=Nil THEN Exit;
  325.  
  326.     NEW(Gauge,Init(9,2,'Converting to PCX',FaxFile^.GetSize));
  327.  
  328.     chf:=$FF;
  329.     dataword:=$FFFF;
  330.     dataword1:=$FFFF;
  331.     counter:=0;
  332.     buftop:=0;
  333.     EOL_count:=0;
  334.     EOL_co:=0;
  335.     flag:=False;
  336.     FaxSize:=0;
  337.     BytesLeft:=0;
  338.     PosX:=0;
  339.     PosY:=0;
  340.     IO:=0;
  341.  
  342.     Fillchar(PCX,Sizeof(PCX),0);
  343.     With PCX DO
  344.     BEGIN
  345.       manufacturer   :=   10;
  346.       version        :=    2;
  347.       encode_mode    :=    1;
  348.       bits_per_pixel :=    1;
  349.       end_x          := 1727;
  350.       Fillchar(palette_RGB,48,255);
  351.       palette_RGB[1] :=    0;
  352.       palette_RGB[2] :=    0;
  353.       palette_RGB[3] :=    0;
  354.       planes         :=    1;
  355.       bytes_per_line :=  216;
  356.     END;
  357.     PCXFile^.Write(PCX,Sizeof(Pcx));
  358.  
  359.     BytesLeft:=FaxFile^.GetSize;
  360.     FaxSize:=BytesLeft;
  361.  
  362.     Fillchar(BmpLine,Sizeof(BmpLine),255);
  363.  
  364.     WHILE (bytesleft>0) DO
  365.     BEGIN
  366.       WHILE buftop<13 DO
  367.       BEGIN
  368.         IF Counter=0 THEN
  369.         BEGIN
  370.           Dec(BytesLeft);
  371.           IF BytesLeft=0 THEN Break;
  372.           FaxFile^.Read(chf, 1);
  373.           counter:=8;
  374.         END;
  375.         dataword:=dataword SHL 1;
  376.         IF chf AND $80=$80 THEN dataword:=dataword or 1;
  377.         chf:=chf SHL 1;
  378.         Dec(counter);
  379.         Inc(buftop);
  380.       END;
  381.  
  382.       IF EOL_co=0 THEN
  383.       BEGIN
  384.         dataword1:=dataword AND EOLRUN.mask;
  385.         IF dataword1=EOLRUN.data THEN
  386.         BEGIN
  387.           Dec(buftop,EOLRUN.size);
  388.           Inc(EOL_count);
  389.           EOL_co:=1;
  390.           flag:=False;
  391.           PosX:=0;
  392.           Inc(PosY);
  393.           PutPCXLine(216);
  394.           Fillchar(BmpLine,Sizeof(BmpLine),255);
  395.           Gauge^.Update(FaxFile^.GetPos);
  396.         END;
  397.         IF buftop>=13 THEN Dec(BufTop);
  398.       END;
  399.  
  400.       IF (EOL_co=1) AND Flag THEN
  401.       BEGIN
  402.         EOL_co:=2;
  403.         Flag:=False;
  404.         FOR x:=1 TO 27 DO
  405.         BEGIN
  406.           dataword1:=dataword AND WhiteMakeUp[x].mask;
  407.           IF dataword1=WhiteMakeUp[x].data THEN
  408.           BEGIN
  409.             Inc(PosX,x*64);
  410.             Dec(buftop,WhiteMakeUp[x].size);
  411.             break;
  412.           END;
  413.         END;
  414.       END;
  415.  
  416.       IF (EOL_co=2) AND Flag THEN
  417.       BEGIN
  418.         EOL_co:=0;
  419.         Flag:=False;
  420.         FOR x:=1 TO 64 DO
  421.         BEGIN
  422.           dataword1:=dataword AND FaxWhite[x].mask;
  423.           IF dataword1=FaxWhite[x].data THEN
  424.           BEGIN
  425.             Inc(PosX,FaxWhite[x].value);
  426.             Dec(buftop,FaxWhite[x].size);
  427.             EOL_co:=3;
  428.             break;
  429.           END;
  430.         END;
  431.       END;
  432.  
  433.       IF (EOL_co=3) AND Flag THEN
  434.       BEGIN
  435.         EOL_co:=4;
  436.         Flag:=False;
  437.         FOR x:=1 TO 27 DO
  438.         BEGIN
  439.           dataword1:=dataword AND BlackMakeUp[x].mask;
  440.           IF dataword1=BlackMakeUp[x].data THEN
  441.           BEGIN
  442.             y:=x*64+PosX-1; IF y>1728 THEN y:=1728;
  443.             FOR z:=PosX TO y DO BmpPixel(z);
  444.             Inc(PosX,x*64);
  445.             Dec(buftop,BlackMakeUp[x].size);
  446.             break;
  447.           END;
  448.         END;
  449.       END;
  450.  
  451.       IF (EOL_co=4) AND Flag THEN
  452.       BEGIN
  453.         EOL_co:=0;
  454.         Flag:=False;
  455.         FOR x:=1 TO 64 DO
  456.         BEGIN
  457.           dataword1:=dataword AND FaxBlack[x].mask;
  458.           IF dataword1=FaxBlack[x].data THEN
  459.           BEGIN
  460.             y:=PosX+FaxBlack[x].value-1;
  461.             IF y>1728 THEN y:=1728;
  462.             FOR z:=PosX TO y DO BmpPixel(z);
  463.             Inc(PosX,FaxBlack[x].value);
  464.             Dec(buftop,FaxBlack[x].size);
  465.             EOL_co:=1;
  466.             break;
  467.           END;
  468.         END;
  469.       END;
  470.       Flag:=True;
  471.     END; { bytesleft>0 }
  472.     Dispose(FaxFile, Done);
  473.     Dispose(Gauge,Done);
  474.     PCXFile^.Seek(0);
  475.     PCX.end_y:=PosY-1;
  476.     PCXFile^.Write(PCX,Sizeof(Pcx));
  477.     Dispose(PCXFile, Done);
  478.   END;
  479.  
  480. END.
  481.